package com.bjc.platform.export;

import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjc.platform.exception.JasperReportException;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet;

/** 
 *  
 */
public class PDFExport {

	/**
	 * 导出报表
	 * 
	 * @param request
	 * @param response
	 * @param reportFilePath
	 * @param params
	 * @param con
	 * @param fileName
	 * @throws JasperReportException
	 */
	public void export(HttpServletRequest request,
			HttpServletResponse response, String reportFilePath, Map params,
			Connection con, String fileName) throws JasperReportException {

		JasperPrint jasperPrint = new JasperPrintWithConnection(reportFilePath,
				params, con).getJasperPrint();
		// 将填充完的japserPrint放入session中。
		request.getSession().setAttribute(
				BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE,
				jasperPrint);
		// 拿到japserPrintList
		List jasperPrintList = BaseHttpServlet.getJasperPrintList(request);
		// 若没有JasperPrintList，则抛出异常
		if (jasperPrintList == null) {
			throw new JasperReportException(
					"在Http Session中没有找到JasperPrint List");
		}
		try {
			OutputStream ouputStream = response.getOutputStream();
			try {
				response.setContentType("application/pdf");
				response.setCharacterEncoding("UTF-8");
				if (fileName == null || fileName.equals(""))
					response.setHeader("Content-Disposition",
							"inline; filename=\"noTitle.pdf\"");
				else
					response.setHeader(
							"Content-Disposition",
							"inline; filename=\""
									+ URLEncoder.encode(fileName, "UTF-8")
									+ ".pdf\"");
				// 使用JRPdfExproter导出器导出pdf
				JRPdfExporter exporter = new JRPdfExporter();
				// 设置JasperPrintList
				exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST,
						jasperPrintList);

				exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
						ouputStream);
				exporter.exportReport();
			} catch (JRException e) {
				e.printStackTrace();
				throw new JasperReportException("在导出pdf格式报表时发生错误");
			} finally {
				if (ouputStream != null) {
					try {
						ouputStream.close();
					} catch (IOException ex) {
					}
				}
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
			throw new JasperReportException("从Response中取得OutputStream时发生错误!");
		}
	}

}